home *** CD-ROM | disk | FTP | other *** search
/ PC User 2004 August / Disc 1 / PCU0804CD1.iso / software / browsers / files / opera1.exe / OPERA.JAR / com / opera / PluginClassLoader.class (.txt) < prev    next >
Encoding:
Java Class File  |  2004-02-12  |  6.0 KB  |  206 lines

  1. package com.opera;
  2.  
  3. import java.io.File;
  4. import java.io.FilePermission;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.net.HttpURLConnection;
  8. import java.net.SocketPermission;
  9. import java.net.URL;
  10. import java.net.URLClassLoader;
  11. import java.net.URLConnection;
  12. import java.security.AccessController;
  13. import java.security.AllPermission;
  14. import java.security.CodeSource;
  15. import java.security.PermissionCollection;
  16. import java.util.Enumeration;
  17. import java.util.PropertyPermission;
  18.  
  19. public class PluginClassLoader extends URLClassLoader {
  20.    private static RuntimePermission usePolicyPermission = new RuntimePermission("usePolicy");
  21.    private static PropertyPermission browserReadPerm = new PropertyPermission("browser", "read");
  22.    private static PropertyPermission browserVerReadPerm = new PropertyPermission("browser.version", "read");
  23.    private URL codeBase;
  24.    String key;
  25.    private AppContextAdapter appContext = null;
  26.    private ThreadGroup threadGroup = null;
  27.    private int usageCount = 0;
  28.    private Object usageCountSync = new Object();
  29.  
  30.    URL getCodeBase() {
  31.       return this.codeBase;
  32.    }
  33.  
  34.    String getKey() {
  35.       return this.key;
  36.    }
  37.  
  38.    public PluginClassLoader(URL var1, String var2) {
  39.       super(new URL[0]);
  40.       this.codeBase = var1;
  41.       this.key = var2;
  42.    }
  43.  
  44.    public void addJar(URL var1) {
  45.       this.addURL(var1);
  46.    }
  47.  
  48.    ThreadGroup getThreadGroup() {
  49.       try {
  50.          if (this.threadGroup == null || this.threadGroup.isDestroyed()) {
  51.             this.threadGroup = new ThreadGroup(this.codeBase + "-threadGroup");
  52.             this.threadGroup.setMaxPriority(4);
  53.             AppContextCreator var1 = new AppContextCreator(this.threadGroup);
  54.             var1.setContextClassLoader(this);
  55.             synchronized(var1.syncObject) {
  56.                var1.start();
  57.  
  58.                try {
  59.                   var1.syncObject.wait();
  60.                } catch (InterruptedException var5) {
  61.                }
  62.  
  63.                this.appContext = var1.appContext;
  64.             }
  65.  
  66.             Object var8 = null;
  67.          }
  68.       } catch (Exception var7) {
  69.          var7.printStackTrace(System.err);
  70.       }
  71.  
  72.       return this.threadGroup;
  73.    }
  74.  
  75.    protected int getUsageCount() {
  76.       return this.usageCount;
  77.    }
  78.  
  79.    protected void grab() {
  80.       synchronized(this.usageCountSync) {
  81.          ++this.usageCount;
  82.          this.getThreadGroup();
  83.       }
  84.    }
  85.  
  86.    protected void release() {
  87.       synchronized(this.usageCountSync) {
  88.          if (this.usageCount > 1) {
  89.             --this.usageCount;
  90.          } else {
  91.             if (this.appContext != null) {
  92.                try {
  93.                   this.appContext.dispose();
  94.                } catch (IllegalThreadStateException var4) {
  95.                   var4.printStackTrace(System.err);
  96.                }
  97.             }
  98.  
  99.             this.usageCount = 0;
  100.             this.appContext = null;
  101.             this.threadGroup = null;
  102.             PluginPanel.cacheClassLoader(this);
  103.          }
  104.  
  105.       }
  106.    }
  107.  
  108.    public AppContextAdapter getAppContext() {
  109.       return this.appContext;
  110.    }
  111.  
  112.    public PermissionCollection getPermissions(CodeSource var1) {
  113.       PermissionCollection var2 = super.getPermissions(var1);
  114.       URL var3 = var1.getLocation();
  115.       if (var3.getProtocol().equals("file")) {
  116.          String var4 = var3.getFile().replace('/', File.separatorChar);
  117.          if (!var4.endsWith(File.separator)) {
  118.             int var5 = var4.lastIndexOf(File.separatorChar);
  119.             if (var5 != -1) {
  120.                var4 = var4.substring(0, var5 + 1) + "-";
  121.                var2.add(new FilePermission(var4, "read"));
  122.             }
  123.          }
  124.  
  125.          var2.add(new SocketPermission("localhost", "connect,accept"));
  126.          AccessController.doPrivileged(new 1(this, var2));
  127.          if (this.codeBase.getProtocol().equals("file")) {
  128.             String var7 = this.codeBase.getFile().replace('/', File.separatorChar);
  129.             if (var7.endsWith(File.separator)) {
  130.                var7 = var7 + "-";
  131.             }
  132.  
  133.             var2.add(new FilePermission(var7, "read"));
  134.          }
  135.       }
  136.  
  137.       var2.add(browserReadPerm);
  138.       var2.add(browserVerReadPerm);
  139.       if (var1.getCertificates() != null && !var2.implies(usePolicyPermission) && this.allPermissionsGranted(var1)) {
  140.          var2.add(new AllPermission());
  141.       }
  142.  
  143.       return var2;
  144.    }
  145.  
  146.    boolean allPermissionsGranted(CodeSource var1) {
  147.       return System.getProperty("browser.opera.useCertificateHandler").equals("true") ? CertificateHandler.checkCertificates(var1) : false;
  148.    }
  149.  
  150.    public URL findResource(String var1) {
  151.       URL var2 = super.findResource(var1);
  152.       if (var2 == null) {
  153.          try {
  154.             var2 = new URL(this.codeBase, var1);
  155.             if (!this.resourceExists(var2)) {
  156.                var2 = null;
  157.             }
  158.          } catch (Exception var4) {
  159.             var2 = null;
  160.          }
  161.       }
  162.  
  163.       return var2;
  164.    }
  165.  
  166.    private boolean resourceExists(URL var1) {
  167.       boolean var2 = true;
  168.  
  169.       try {
  170.          URLConnection var3 = var1.openConnection();
  171.          if (var3 instanceof HttpURLConnection) {
  172.             HttpURLConnection var4 = (HttpURLConnection)var3;
  173.             int var5 = var4.getResponseCode();
  174.             if (var5 == 200) {
  175.                return true;
  176.             }
  177.  
  178.             if (var5 >= 400) {
  179.                return false;
  180.             }
  181.          } else {
  182.             InputStream var7 = var3.getInputStream();
  183.             var7.close();
  184.          }
  185.       } catch (Exception var6) {
  186.          var2 = false;
  187.       }
  188.  
  189.       return var2;
  190.    }
  191.  
  192.    public Enumeration findResources(String var1) throws IOException {
  193.       if (var1 != null && var1.indexOf("META-INF/services/javax.sound") != -1) {
  194.          return new 2(this);
  195.       } else {
  196.          URL var2 = new URL(this.codeBase, var1);
  197.          if (!this.resourceExists(var2)) {
  198.             var2 = null;
  199.          }
  200.  
  201.          Enumeration var3 = super.findResources(var1);
  202.          return new 3(this, var3, var2);
  203.       }
  204.    }
  205. }
  206.